package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name     string  `json:"name"`
	Age      int     `json:"age"`
	Birthday string  `json:"birthday"`
	Sal      float64 `json:"sal"`
	Skill    string  `json:"skill"`
}

func unmarshalStruct() {
	str := "{\"name\":\"牛魔王\",\"age\":500,\"birthday\":\"2011-11-11\",\"sal\":8000,\"skill\":\"牛魔拳\"} "
	var monster Monster
	err := json.Unmarshal([]byte(str), &monster)
	if err != nil {
		fmt.Printf("unmarshal 发生异常 ：%v \n", err)
	}
	fmt.Printf("反序列化后： monster: %v \n", monster)
	//反序列化后： monster={牛魔王 500 2011-11-11 8000 牛魔拳}
}

func unmarshalMap() {
	str := "{\"addr\":\"洪崖洞\",\"age\":30,\"name\":\"红孩儿\"}"

	//定义一个map
	var myMap map[string]interface{}
	//反序列
	//注意：反序列map，不需要make,因为make操作被封装到unmarshal函数中
	err := json.Unmarshal([]byte(str), &myMap)
	if err != nil {
		fmt.Printf("unmarshal 异常 ：%v \n", err)
	}
	fmt.Printf("反序列化后 map :%v \n", myMap)
}

func unmarshalSlilce() {
	str := "[{\"addr\":\"北京\",\"age\":17,\"name\":\"jack\"}," +
		"{\"addr\":[\"北京\",\"上海\"],\"age\":19,\"name\":\"sam\"}]"
		//定义一个slice
	var slice []map[string]interface{}

	//注意：slice，不需要make,因为make操作被封装到unmarshal函数中
	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		fmt.Printf("unmarshal 异常 ：%v \n", err)
	}
	fmt.Printf("反序列化后 slice :%v \n", slice)
}

func main() {
	unmarshalStruct()
	unmarshalMap()
	unmarshalSlilce()
}
